package model.kwalificatiebeheer;

import java.util.Map;
import java.util.Observable;
import java.util.TreeMap;
import java.util.TreeSet;

import model.DAO.IDAOKerntaak;

public class Kerntaak extends Observable implements Comparable<Kerntaak>{
	/**
	 * Variables
	 */
	private int id;
	private String title;
	private KwalificatieDossier kd;
	private TreeMap<Uitstroomrichting, TreeSet<Werkproces>> uitstroomWerkprocessen;
	
	/**
	 * Constructors
	 */
	public Kerntaak(int id, KwalificatieDossier kd){
		this(id, kd, "");
	}
	public Kerntaak(int id, KwalificatieDossier kd, String title){
		this.id = id;
		this.kd = kd;
		this.title = title;
		uitstroomWerkprocessen = new TreeMap<Uitstroomrichting, TreeSet<Werkproces>>();
	}
	/**
	 * Getters and Setters
	 */
	public int getId(){
		return id;
	}
	
	public String getTitle(){
		return title;
	}
	public void setTitle(String title){
		this.title = title;
		setChanged();
		notifyObservers();
	}
	public TreeMap<Uitstroomrichting, TreeSet<Werkproces>> getUitstroomWerkprocessen() {
		return uitstroomWerkprocessen;
	}
	public void setUitstroomWerkprocessen(
			TreeMap<Uitstroomrichting, TreeSet<Werkproces>> uitstroomWerkprocessen) {
		this.uitstroomWerkprocessen = uitstroomWerkprocessen;
	}
	
	public KwalificatieDossier getKd() {
		return kd;
	}
	public void setKd(KwalificatieDossier kd) {
		this.kd = kd;
	}
	/**
	 * @Override
	 * @name: 		compareTo
	 * @description:Compares given Object to this
	 * 				Object. Returns 0 if equals, 
	 * 				returns id if not equals.
	 * @return:		String
	 */
	public int compareTo(Kerntaak kerntaak) {
		return id == kerntaak.getId() ? 0 : id;
	}

	/**
	 * @Override
	 * @name: 		equals
	 * @description:Checks if given Object equals
	 * 				this Object
	 * @return:		boolean
	 */
	public boolean equals(Object obj) {
		Kerntaak kerntaak = (Kerntaak) obj;
		return (kerntaak.getId() == id);
	}

	/**
	 * @Override
	 * @name: 		hashCode
	 * @description:Returns object unic identifier
	 * @return:		int
	 */
	public int hashCode() {
		return id;
	}
	
	/**
	 * @Override
	 * @name: 		toString
	 * @description:Creates String from Object
	 * @return:		String
	 */
	public String toString(){
		return "Kerntaak {\n" +
				" id: "+id+"\n" +
				" title: "+title+"\n" +
				"}";
	}
	
	/**
	 * @name: 		addUitstroom
	 * @param:		Uitsroomrichting ur
	 * @description:..
	 * @return:		Void
	 */
	public void addUitstroom(Uitstroomrichting ur){
		uitstroomWerkprocessen.put(ur, new TreeSet<Werkproces>());
		setChanged();
		notifyObservers();
	}
	
	/**
	 * @name: 		addUitstroom
	 * @param:		Uitsroomrichting ur
	 * 				TreeSet<Werkproces> wpSet
	 * @description:..
	 * @return:		Void
	 */
	public void addUitstroom(Uitstroomrichting ur,  TreeSet<Werkproces> wpSet){
		uitstroomWerkprocessen.put(ur, wpSet);
		setChanged();
		notifyObservers();
	}
	
	/**
	 * @name: 		addWerkproces
	 * @params:		Uitstroomrichting ur
	 * 				Werkproces wp
	 * @description:Adds given werkproces to given 
	 * 				Uitstroomrichting if it exists
	 * @return:		void
	 */
	public void addWerkproces(Uitstroomrichting ur,  Werkproces wp){
		if(uitstroomWerkprocessen.get(ur) != null){
			uitstroomWerkprocessen.get(ur).add(wp);
			setChanged();
			notifyObservers();
		}else{
			addUitstroom(ur);
			addWerkproces(ur,  wp);
		}
	}
	
	public void deleteWerkproces(Uitstroomrichting uit, Werkproces wp){
		uitstroomWerkprocessen.get(uit).remove(wp);
		setChanged();
		notifyObservers();
	}
	
	/**
	 * @name: 		deleteWerkproces
	 * @params:	Werkproces wp
	 * @description:deletes werkproces
	 * @return:		void
	 */
	public void deleteWerkproces(Werkproces wp){
		for(Map.Entry<Uitstroomrichting, TreeSet<Werkproces>> entry: uitstroomWerkprocessen.entrySet()){
			TreeSet<Werkproces> set = entry.getValue();
			uitstroomWerkprocessen.remove(wp);
		}
		setChanged();
		notifyObservers();
	}
	
	public void deleteUitstroomRichting(Uitstroomrichting uit){
		uitstroomWerkprocessen.remove(uit);
		setChanged();
		notifyObservers();
	}
	
	public void update(){
		
	}
	
}
